import { qrLoginAPI } from '../../utils/api';

Page({
  data: {
    testSessionId: '',
    qrCodeData: '',
    generateTime: '',
    isGenerating: false,
    scanResult: '',
    loginSuccess: false,
    message: '',
    currentScene: '', // 当前scene参数
    sceneInput: '' // 手动输入的scene参数
  },

  onLoad(options) {
    // 从小程序码扫描获取scene参数
    const scene = options.scene;
    // 验证scene格式：必须是28位字符
    // if (scene && scene.length === 28) {
    //   console.log('获取到scene:', scene);
      // scene示例: "550e8400e29b41d4a71644661234"
      //            |------ 24位 ------||4位验证码|
      this.setData({ currentScene: scene });
      this.handleLogin(scene);
    // } else {
      // 如果没有scene参数，生成测试二维码
      // this.generateTestQR();
    // }
  },

  // 获取当前小程序码的scene参数
  getCurrentScene() {
    // 方法1: 通过wx.getLaunchOptionsSync获取启动参数
    try {
      const launchOptions = wx.getLaunchOptionsSync();
      if (launchOptions.scene && launchOptions.scene.length === 28) {
        console.log('通过getLaunchOptionsSync获取到scene:', launchOptions.scene);
        this.setData({ currentScene: launchOptions.scene });
        return launchOptions.scene;
      }
    } catch (error) {
      console.log('getLaunchOptionsSync获取scene失败:', error);
    }

    // 方法2: 通过wx.getEnterOptionsSync获取进入参数
    try {
      const enterOptions = wx.getEnterOptionsSync();
      if (enterOptions.scene && enterOptions.scene.length === 28) {
        console.log('通过getEnterOptionsSync获取到scene:', enterOptions.scene);
        this.setData({ currentScene: enterOptions.scene });
        return enterOptions.scene;
      }
    } catch (error) {
      console.log('getEnterOptionsSync获取scene失败:', error);
    }

    return null;
  },

  // 手动输入scene参数
  onSceneInput(e: any) {
    const value = e.detail.value;
    this.setData({ sceneInput: value });
  },

  // 使用手动输入的scene参数登录
  useManualScene() {
    const scene = this.data.sceneInput.trim();
    if (!scene) {
      wx.showToast({
        title: '请输入scene参数',
        icon: 'error'
      });
      return;
    }
    
    // if (scene.length !== 28) {
    //   wx.showToast({
    //     title: 'scene参数必须是28位',
    //     icon: 'error'
    //   });
    //   return;
    // }

    console.log('使用手动输入的scene参数:', scene);
    this.handleLogin(scene);
  },

  // 生成测试scene参数
  generateTestScene() {
    // 生成24位随机字符串 + 4位验证码
    const chars = '0123456789abcdef';
    let sessionId = '';
    for (let i = 0; i < 24; i++) {
      sessionId += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    
    // 生成4位验证码
    let verifyCode = '';
    for (let i = 0; i < 4; i++) {
      verifyCode += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    
    const testScene = sessionId + verifyCode;
    console.log('生成测试scene参数:', testScene);
    
    this.setData({ 
      sceneInput: testScene,
      currentScene: testScene 
    });
    
    wx.showToast({
      title: '测试scene已生成',
      icon: 'success'
    });
  },

  // 处理登录流程
  async handleLogin(scene: string) {
    wx.showLoading({ title: '登录中...' });
    try {
      // 1. 获取小程序登录凭证
      const { code } = await this.wxLogin();
      console.log(code);
      
      // 2. 获取用户信息（可选）
      const userInfo = await this.getUserInfo();
      console.log(userInfo);
      
      // 3. 调用登录接口
      const result = await this.callLoginAPI(scene, code, {});
      
      wx.hideLoading();
      
      if (result.success) {
        this.showSuccess(result);
      } else {
        this.showError(result.message || '登录失败');
      }
      
    } catch (error) {
      wx.hideLoading();
      console.error('登录失败:', error);
      this.showError('登录失败，请重试');
    }
  },

  // 微信登录
  wxLogin() {
    return new Promise((resolve, reject) => {
      wx.login({
        success: resolve,
        fail: reject
      });
    });
  },

  // 获取用户信息
  async getUserInfo() {
    try {
      const result = await new Promise((resolve, reject) => {
        wx.getUserProfile({
          desc: '用于完善用户资料',
          success: resolve,
          fail: reject
        });
      });
      return result.userInfo;
    } catch (error) {
      console.log('用户拒绝授权，使用默认信息');
      return null; // 返回null，接口会使用默认用户信息
    }
  },

  // 调用登录API
  callLoginAPI(scene: string, code: string, userInfo: any) {
    return qrLoginAPI.miniprogramLogin(scene, code, userInfo);
  },

  // 显示成功信息
  showSuccess(data: any) {
    const { user } = data;
    
    wx.showToast({
      title: user.is_new_user ? '注册成功！' : '登录成功！',
      icon: 'success'
    });
    this.setData({
      loginSuccess: true,
      message: `欢迎 ${user.nickname}！`
    });

    // 准备用户信息数据
    const userInfoData = {
      nickname: user.nickname || '魔力玩家',
      avatar: user.avatar || '/static/default-avatar.png',
      level: '1',
      gameId: user.username || 'Player001',
      qq: '未设置',
      registerTime: new Date().getFullYear() + '年'
    };

    // 2秒后跳转到登录成功页面
    setTimeout(() => {
      wx.navigateTo({
        url: '/pages/login-success/login-success?userInfo=' + encodeURIComponent(JSON.stringify(userInfoData)),
        success: () => {
          console.log('跳转到登录成功页面');
        },
        fail: (error) => {
          console.error('跳转到登录成功页面失败:', error);
          // 如果跳转失败，回退到上一页
          wx.navigateBack();
        }
      });
    }, 2000);
  },

  // 显示错误信息
  showError(message: string) {
    wx.showModal({
      title: '登录失败',
      content: message,
      showCancel: false
    });
  },

  // 生成测试二维码
  generateTestQR() {
    this.setData({ isGenerating: true });
    
    // 生成随机的Session ID
    const sessionId = 'test_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
    
    // 构建测试数据
    const testData = {
      session_id: sessionId,
      type: 'login',
      timestamp: Date.now(),
      test: true
    };
    
    const qrCodeData = JSON.stringify(testData);
    
    this.setData({
      testSessionId: sessionId,
      qrCodeData: qrCodeData,
      generateTime: new Date().toLocaleString(),
      isGenerating: false
    });

    console.log('生成测试二维码数据:', testData);
    
    // 生成二维码到canvas
    this.drawQRCode(qrCodeData);
  },

  // 绘制二维码到canvas
  drawQRCode(data: string) {
    const ctx = wx.createCanvasContext('qrCanvas');
    
    // 清空canvas
    ctx.clearRect(0, 0, 300, 300);
    
    // 设置背景
    ctx.setFillStyle('#ffffff');
    ctx.fillRect(0, 0, 300, 300);
    
    // 这里应该使用二维码生成库
    // 由于小程序限制，我们先用文字显示
    ctx.setFillStyle('#000000');
    ctx.setFontSize(12);
    ctx.setTextAlign('center');
    ctx.fillText('测试二维码', 150, 140);
    ctx.fillText('点击扫描测试', 150, 160);
    
    ctx.draw();
    
    console.log('二维码绘制完成');
  },

  // 刷新测试二维码
  refreshTestQR() {
    this.generateTestQR();
  },

  // 复制二维码数据
  copyQRData() {
    wx.setClipboardData({
      data: this.data.qrCodeData,
      success: () => {
        wx.showToast({
          title: '二维码数据已复制',
          icon: 'success'
        });
        console.log('复制二维码数据:', this.data.qrCodeData);
      }
    });
  },

    // 扫描测试
  scanTestQR() {
    console.log('开始扫描测试...');
    
    wx.scanCode({
      success: (res) => {
        console.log('扫描测试成功:', res);
        
        // 尝试从扫描结果中提取scene参数
        const scene = this.extractSceneFromScanResult(res.result);
        
        if (scene) {
          console.log('检测到scene参数:', scene);
          // 更新当前scene参数显示
          this.setData({ 
            currentScene: scene,
            scanResult: `检测到scene参数: ${scene}\n\n完整扫描结果:\n${JSON.stringify(res, null, 2)}`
          });
          // 自动触发登录流程
          this.handleLogin(scene);
        } else {
          // 检查是否是28位的纯scene参数
          if (res.result && res.result.length === 28) {
            console.log('检测到28位scene参数:', res.result);
            this.setData({ 
              currentScene: res.result,
              scanResult: `检测到28位scene参数: ${res.result}\n\n完整扫描结果:\n${JSON.stringify(res, null, 2)}`
            });
            this.handleLogin(res.result);
          } else {
            // 显示扫描结果
            this.setData({
              scanResult: `扫描结果:\n${JSON.stringify(res, null, 2)}\n\n注意: 未检测到scene参数`
            });
            
            wx.showToast({
              title: '扫描成功',
              icon: 'success'
            });
          }
        }
      },
      fail: (error) => {
        console.error('扫描测试失败:', error);
        wx.showToast({
          title: '扫描失败',
          icon: 'error'
        });
      }
    });
  },

  // 从扫描结果中提取scene参数
  extractSceneFromScanResult(scanResult: string): string | null {
    console.log('尝试从扫描结果提取scene参数:', scanResult);
    
    // 方法1: 直接是28位scene参数
    if (scanResult && scanResult.length === 28 && /^[0-9a-f]{28}$/i.test(scanResult)) {
      return scanResult;
    }
    
    // 方法2: 从URL参数中提取scene
    if (scanResult.includes('scene=')) {
      const sceneMatch = scanResult.match(/scene=([^&]+)/);
      if (sceneMatch && sceneMatch[1]) {
        const scene = decodeURIComponent(sceneMatch[1]);
        if (scene.length === 28 && /^[0-9a-f]{28}$/i.test(scene)) {
          return scene;
        }
      }
    }
    
    // 方法3: 从JSON数据中提取scene
    try {
      const jsonData = JSON.parse(scanResult);
      if (jsonData.scene && jsonData.scene.length === 28 && /^[0-9a-f]{28}$/i.test(jsonData.scene)) {
        return jsonData.scene;
      }
    } catch (e) {
      // 不是JSON格式，继续其他方法
    }
    
    // 方法4: 从小程序码格式中提取
    // 小程序码通常包含类似这样的格式：pages/qrtest/qrtest?scene=xxx
    if (scanResult.includes('pages/') && scanResult.includes('scene=')) {
      const sceneMatch = scanResult.match(/scene=([^&]+)/);
      if (sceneMatch && sceneMatch[1]) {
        const scene = decodeURIComponent(sceneMatch[1]);
        if (scene.length === 28 && /^[0-9a-f]{28}$/i.test(scene)) {
          return scene;
        }
      }
    }
    
    console.log('未找到有效的scene参数');
    return null;
  },

  // 解析扫描数据
  parseScanData(qrCodeData: string) {
    try {
      const data = JSON.parse(qrCodeData);
      return {
        类型: 'JSON格式',
        数据: data
      };
    } catch (e) {
      // 尝试解析URL参数
      if (qrCodeData.includes('=')) {
        const params = {};
        const pairs = qrCodeData.split('&');
        pairs.forEach(pair => {
          const [key, value] = pair.split('=');
          params[key] = value;
        });
        return {
          类型: 'URL参数格式',
          数据: params
        };
      }
      
      return {
        类型: '纯文本格式',
        数据: qrCodeData
      };
    }
  },

  // 页面分享
  onShareAppMessage() {
    return {
      title: '二维码测试工具',
      path: '/pages/qrtest/qrtest'
    };
  }
}); 